|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using Microsoft.CodeAnalysis;
namespace Roslyn.Utilities;
internal readonly struct ConcatImmutableArray<T>(ImmutableArray<T> first, ImmutableArray<T> second) : IEnumerable<T>
{
public int Length => first.Length + second.Length;
public bool Any(Func<T, bool> predicate)
=> first.Any(predicate) || second.Any(predicate);
public Enumerator GetEnumerator()
=> new(first, second);
public ImmutableArray<T> ToImmutableArray()
=> first.NullToEmpty().AddRange(second.NullToEmpty());
IEnumerator<T> IEnumerable<T>.GetEnumerator()
=> GetEnumerator();
IEnumerator IEnumerable.GetEnumerator()
=> GetEnumerator();
public struct Enumerator(ImmutableArray<T> first, ImmutableArray<T> second) : IEnumerator<T>
{
private ImmutableArray<T>.Enumerator _current = first.NullToEmpty().GetEnumerator();
private ImmutableArray<T> _next = second.NullToEmpty();
public T Current => _current.Current;
object? IEnumerator.Current => Current;
public bool MoveNext()
{
if (_current.MoveNext())
{
return true;
}
_current = _next.GetEnumerator();
_next = [];
return _current.MoveNext();
}
readonly void IDisposable.Dispose()
{
}
void IEnumerator.Reset()
=> throw new NotSupportedException();
}
}
internal static partial class ImmutableArrayExtensions
{
public static ConcatImmutableArray<T> ConcatFast<T>(this ImmutableArray<T> first, ImmutableArray<T> second)
=> new(first, second);
}
|